# -*- coding: utf-8 -*-

from django.db import models
from django.contrib.auth.models import User

from cliente.models import Cliente
from estoque.models import Produto
from impressao.models import Impressora

class Guiche(models.Model):
    class Meta:
        verbose_name_plural = 'Guichês'
        verbose_name = 'Guichê'
    
    numero = models.IntegerField(u'Número do caixa', unique = True)
    impressora = models.ForeignKey(Impressora, blank = True, null = True)
    
    def __unicode__(self):
        return str(self.numero)

class Caixa(models.Model):
    class Meta:
        permissions = (
            ("abrir_caixa", "Pode abrir um caixa"),
            ("alterar_caixa", "Pode alterar um caixa"),
            ("view_caixa", "Pode visualizar Caixa"),
        )
    
    operador = models.ForeignKey(User)
    guiche = models.ForeignKey(Guiche)
    
    valor_inicial = models.DecimalField(u'Valor inicial', max_digits = 10, decimal_places = 2)
    
    dinheiro = models.DecimalField(u'Valor final em dinheiro', max_digits = 10, decimal_places = 2, default = 0)
    debito = models.DecimalField(u'Valor final em débito', max_digits = 10, decimal_places = 2, default = 0)
    cartao = models.DecimalField(u'Valor final em cartão (crédito)', max_digits = 10, decimal_places = 2, default = 0)
    cheque = models.DecimalField(u'Valor final em cheque', max_digits = 10, decimal_places = 2, default = 0)
    crediario = models.DecimalField(u'Valor final em crediário', max_digits = 10, decimal_places = 2, default = 0)
    
    recebimento = models.DecimalField(u'Valor final em dinheiro dos recebimentos', max_digits = 10, decimal_places = 2, default = 0)
    
    valor_recebido = models.DecimalField(u'Total de Valores recebidos', max_digits = 20, decimal_places = 2, default = 0)
    valor_retirado = models.DecimalField(u'Total de Valores retirados', max_digits = 20, decimal_places = 2, default = 0)
    
    aberto = models.DateTimeField(u'Momento de abertura')
    fechado = models.DateTimeField(u'Momento de abertura', blank = True, null = True)
    
    modificacao = models.DateTimeField(u'Data e hora da entrada', auto_now = True)
    usuario = models.ForeignKey(User, related_name = 'usuario')
    
    def __unicode__(self):
        return self.operador.first_name + ' ' + self.operador.last_name + ' - ' + str(self.aberto)

class Entrada(models.Model):
    class Meta:
        permissions = (
            ("view_entrada", "Pode visualizar Entradas"),
            ("adicionar_entrada", "Pode adicionar Entradas"),
            ("esconder_entrada", "Pode esconder Entradas"),
        )
    
    caixa = models.ForeignKey(Caixa)
    usuario = models.ForeignKey(User)
    valor = models.DecimalField(u'Valor recebido', max_digits = 20, decimal_places = 2, default = 0)
    data = models.DateTimeField(u'Data e hora da entrada', auto_now_add = True)
    observacao = models.TextField(u'Observação')
    exibir = models.BooleanField(u'Exibir estes dados na página', default = True)

class Saida(models.Model):
    class Meta:
        permissions = (
            ("view_saida", "Pode visualizar Saídas"),
            ("adicionar_saida", "Pode adicionar Saídas"),
            ("esconder_saida", "Pode esconder Saídas"),
        )
    
    caixa = models.ForeignKey(Caixa)
    usuario = models.ForeignKey(User)
    valor = models.DecimalField(u'Valor retirado', max_digits = 20, decimal_places = 2, default = 0)
    data = models.DateTimeField(u'Data e hora da saída', auto_now_add = True)
    observacao = models.TextField(u'Observação')
    exibir = models.BooleanField(u'Exibir estes dados na página', default = True)

class Pedido(models.Model):
    class Meta:
        permissions = (
            ("dar_desconto", "Pode dar descontos"),
            ("novo_pedido", "Pode criar um novo pedido"),
            ("alterar_pedido", "Pode alterar um pedido"),
        )
    
    caixa = models.ForeignKey(Caixa)
    total = models.DecimalField(u'Preço Total', max_digits=10, decimal_places=2)
    aberto = models.DateTimeField(u'Data de abertura')
    fechado = models.DateTimeField(u'Data de Fechamento', blank = True, null = True)
    desconto = models.CharField(u'Desconto', null = False, blank = True, max_length = 10)
    #Quem recebe a comissão pela venda (ex. vendedor)
    vendedor = models.ForeignKey(User, null = True, blank = True)
    #Cliente do estabelecimento
    cliente = models.ForeignKey(Cliente, null = True, blank = True)
    
    def save(self, *args, **kwargs):
        self.desconto = str(self.desconto).strip()
        if self.desconto != '0':
            permitidos = '0123456789,.% '
            desconto = self.desconto.strip()
            
            descontovalido = True
            for i in range(len(desconto)):
                if permitidos.find(desconto[i]) == -1:
                    request.session['aviso'] = 'Desconto inválido!'
                    self.desconto = '0'

                    descontovalido = False
                    break

            if descontovalido:
                desconto = desconto.replace(',', '.')
                desconto = desconto.replace(' ', '')
                if desconto.count('.') > 1:
                    desconto = desconto.replace('.', '', desconto.count('.') -1)

                ultimo = desconto[len(desconto)-1]
                if ultimo == '%':
                    desconto = float(desconto.replace('%', ''))
                    desconto = float(self.total) * desconto / 100
    
                desconto = float(desconto)
                
                self.desconto = round(desconto, 3)
                
#                print desconto
#                print self.desconto
                if round(desconto, 3) > round(float(self.total), 3):
                    self.desconto = '0'
        
        super(Pedido, self).save(*args, **kwargs)
    
    def __unicode__(self):
        return 'Venda %s' % str(self.id)

class Item(models.Model):
    """
    estado = 0; Produto excluido da lista
    estado = 1; Produto existe
    estado = 2; Produto existe e foi pedido(processado)
    estado = 3; Produto não será cobrado
    """
    class Meta:
        verbose_name_plural = "Itens"

    pedido = models.ForeignKey(Pedido)
    produto = models.ForeignKey(Produto)
    quantidade = models.DecimalField('Quantidade', max_digits=10, decimal_places=3)
    valor = models.DecimalField(u'Valor', max_digits=10, decimal_places=2, default = 0)
    estado = models.IntegerField(default=1, choices = ((0, 'Item excluído da lista'), (1, 'Item está na lista'), (2, 'Item processado'), (3, 'Grátis')))
    data = models.DateTimeField(u'Horário do pedido')
    observacao = models.TextField('Observação', blank=True, null=True, default = '')

    def __unicode__(self):
        return self.produto.descricao

class Pagamento_parcial(models.Model):
    class Meta:
        verbose_name_plural = 'Pagamentos parciais'
        verbose_name = 'Pagamento parcial'
        
    pedido = models.ForeignKey(Pedido)
    valor = models.DecimalField(u'Valor', max_digits=10, decimal_places=2)
    estado = models.IntegerField(default=1, choices = ((0, 'Pagamento excluído da lista'), (1, 'Pagamento está na lista')))
    tipo = models.IntegerField(default=1, choices = ((0, 'Dinheiro'), (1, 'Débido'), (2, 'Cartão (Crádito)'), (3, 'Cheque'), (4, 'Crediário')))
    data = models.DateTimeField(u'Data do pagamento')

    def __unicode__(self):
        return str(self.valor)

class Devolucao(models.Model):
    class Meta:
        permissions = (
            ('fazer_devolucao', 'Pode fazer devolução'),
        )
    
    pedido = models.ForeignKey(Pedido, null = True, blank = True)
    produto = models.ForeignKey(Produto)
    cliente = models.ForeignKey(Cliente)
    valor = models.DecimalField(u'Valor', max_digits=10, decimal_places=2)
    tipo = models.BooleanField(u'Devolução em dinheiro?', default = False)
    motivo = models.TextField(u'Motivo')
    data = models.DateTimeField(u'Horário da devolução', auto_now = True)
